
/****************************************************************
 *
 *    |   分隔符，表示由它分隔的某一个子表达式都可供选择
    *   重复，和正则表达式里的*类似，表示它之前的子表达式可重复多次
    -   排除，不允许出现跟在它后面的那个子表达式
    ,   串接，连接左右子表达式
    ;   终止符，一条规则定义结束
    ''  字符串
    ""  字符串
    (...)  分组，就是平时括号的功能啦，改变优先级用的。
    (*...*) 注释
    [...]  可选，综括号内的子表达式允许出现或不出现
    {...}  重复，大括号内的子表达式可以多次出现
    ?...?   特殊字符，由ISO定义的一些特殊字例如:
 *
 * 由于C++语法规则的限制，Spirit改变了EBNF中的一部分操作符的使用方式，如：

    星号重复符(*)由原来的后置改为前置
    逗号串接符(,)由>>或&&代替
    中括号可选功能([表达式])改为(!表达式)
    大括号重复功能({表达式})由重复符(*表达式)替代
    取消注释功能
    取消特殊字符功能
    同时Spirit又提供了大量的预置解析器加强了它的表达能力，因此可以把Spirit的语法看成是一种EBNF的变种。
 *
 * ****************************************************************/

#include <iostream>
#include <boost/spirit.hpp>
using namespace std;
using namespace boost::spirit;

int main()
{
    parse_info<> r = parse("-12.33E-10",
                           !(ch_p('+')|ch_p('-'))>>+digit_p>>
                                                 !(ch_p('.')>>+digit_p)>>
                                                 !((ch_p('e')|ch_p('E')) >>
                                                                         !(ch_p('+')|ch_p('-'))>>+digit_p)
    );
    cout << "parsed " << (r.full?"successful":"failed") << endl;
    return 0;
}